package com.cskaoyan.javase.array._2initialization;

/**
 * 数组的初始化
 * 类比于变量的初始化,变量的初始化是开辟内存空间,然后存储数值
 * 数组的初始化也是这样的,也需要开辟空间,然后存储元素,二者缺一不可,这就要求数组的初始化要做两点:
 *      1.数组的长度必须要知道,这样才能开辟空间.
 *      2.数组中的每一个元素的取值都要明确
 * 只有满足这两点,数组才能够算完成初始化
 *
 * (一维)数组的初始化也有两种方式:
 *
 * 1.静态初始化,指的是直接明确指出数组中的元素的取值,间接的告诉数组的长度
 * 语法:  数据类型[] 数组名 = _1new 数据类型[]{元素1,元素2,元素3...};
 * new关键字的作用是创建对象(等到JVM内存模型的时候详细说)
 * 当然静态初始化有简化的形式:
 *      数据类型[] 数组名 = {元素1,元素2,元素3...};
 *      注意: 简写形式必须和数组的声明写在一起,不能用"数组名 = {xxx};"
 *
 *
 * 2.动态初始化,指的是直接告诉数组的长度来完成数组的初始化
 * 语法: 数据类型[] 数组名 = _1new 数据类型[数组的长度];
 * 动态初始化只指出了数组的长度,完全没有提数组元素的取值,那么为什么可以完成初始化?
 * 数组是一种引用数据类型,数组的本质是一个对象,而对象中的元素(数组的元素)具有默认值!!!!!!
 * 所以动态初始化,数组的长度是程序员指定的,而数组的元素取值是JVM默认给出的默认值.所以能够完成初始化.
 *
 * 除此之外,数组没有其他初始化方式,尤其是经典错误"动静结合"
 *
 * 数组是一种对内存空间的要求很高的结构，要求内存空间必须是连续的，这意味着数组的内存空间分配是有规划的。数组的初始化一旦完成，它的长度就不能改变了！ 这是数组十分重要的一个特点和缺点
 *  所以,我们如果想使用数组作为容器存储变量,那就必须严格考量数组的长度,长了浪费空间,短了装不下还不能自动扩容,非常难受.
 *  在开发中,直接使用数组作为容器是非常罕见的.而是通过对数组进行一层封装,让它可以扩容,弥补缺点,再去使用它.在java中,集合类的ArrayList就是这样的一种实现.它的底层本质上还是数组,有下标,有随机访问,但是又不受数组长度限制.
 *
 *  扩展思考: ArrayList是怎么实现数组扩容的?
 *  新建一个更长的数组,把原先的元素全部复制过去,旧的数组就不要了
 *
 *  数组初始化开辟内存空间，是开辟谁的内存空间？开辟是JVM的内存空间。
 *
 * @since 10:56
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 静态初始化一个int数组,这是一个长度为0的数组
        int[] arr = new int[]{};

        // 静态初始化一个正常的int数组
        int[] arr2 = new int[]{1, 2, 3};

        // 静态初始化简写形式
        double[] arr3 = {0.1, 0.2, 0.3};

        // 以下形式是错误的
        // arr3 = {0.1};

        // 动态初始化一个String数组
        String[] arr4 = new String[3];

        // 经典"动静结合" 错误
        // int[] arr5 = _1new int[2]{1,2};
    }
}
